/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia_psr.algoritmos;

/**
 *
 * @author Rubén Avalos Elvira y Fabiana Celiberti Tapie
 */
import ia_psr.problemas.Variable;
import ia_psr.graph.Nodo;
import ia_psr.graph.NodoPSR;
import java.util.LinkedList;
import java.util.PriorityQueue;
public class PSRMVR_GH extends PSRMinimoValorRestante {
    protected PriorityQueue<NodoPSR> q;

    public PSRMVR_GH() {
        super();
        q = new PriorityQueue<NodoPSR>();
    }

    // Elegimos el nodo con el menor numero de valores asignables (MVR).
    // En caso de tener mas de un candidato, desempatamos con el grado heuristico
    public NodoPSR nextNode() {
        int CurrentMVRIndex = -1;
        int CurrentMVR = Integer.MAX_VALUE;
        for(Nodo nodo : g.getNodos()) {
            NodoPSR n = (NodoPSR)nodo;
            if (n.valor.getValue() == null) {
                int nodoIndex = g.getNodos().indexOf(n);
                LinkedList<Variable> dominioXi = tabla.get(nodoIndex);
                if (dominioXi.size() < CurrentMVR) {
                    CurrentMVR = dominioXi.size();
                    CurrentMVRIndex = nodoIndex;
                }
            }
        }
        q.clear();
        if (CurrentMVRIndex == -1)
            return null;

        // buscamos todos los nodos con el mismo MVR y escogemos el que tenga
        // un mayor grado heuristico
        for (Nodo nodo : g.getNodos()) {
            NodoPSR n = (NodoPSR)nodo;
            if (n.valor.getValue() == null) {
                int nodoIndex = g.getNodos().indexOf(n);
                LinkedList<Variable> dominioXi = tabla.get(nodoIndex);
                if (dominioXi.size() == CurrentMVR) {
                    q.add(n);
                }
            }
        }
        return q.peek();
    }

}
